///////////////////////////////////////////////////////////
//  ViewXML.cpp
//  Implementation of the Class ViewXML
//  Created on:      23-may-2007 14:48:39
///////////////////////////////////////////////////////////

#include "ViewXML.h"


ViewXML::ViewXML(){
	this->setNombre("viewXML");
}



ViewXML::~ViewXML(){
	

}

int ViewXML::getStatus(){
	return this->status;
}

// agrega un nodo con contenido al params
void ViewXML::addNodeWithContent(std::string name, std::string content){
	
	XMLNode *paramsNode = getParamsNode();

	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == name){
			node->setContenido(content);
			return;
		}	
	}
	
	XMLNode* nod = new XMLNode();
	nod->setNombre(name);
	nod->setContenido(content);
	paramsNode->agregarHijo(nod);
	
}
void ViewXML::setStatus(int status){
	
	std::string stus;
	this->status = status;
	if(status == STATUS_OK)
	{
		stus="OK";
	}
	else
		if(status == STATUS_ERROR)
		{
			stus="ERROR";
		}
		else
			if(status == STATUS_ATENCION)
			{
				stus = "ATENCION";
			}
	addNodeWithContent("status", stus);
	
}


void ViewXML::addMsgToUsr(std::string titulo, std::string contenido){

	msgToUsr += titulo + ". "  + contenido;
	
}

// retorna el nodo donde esta "params"
XMLNode * ViewXML::getParamsNode()
{
	listaXML::iterator it = this->hijos.begin();
	
	for ( ; it != this->hijos.end(); it++){
		XMLNode* nodeSt = *it;
		if (nodeSt->getNombre().find( "params" ) != std::string::npos){
			return nodeSt;
		}
	}
	
	XMLNode* nodParam = new XMLNode();
	nodParam->setNombre("params");
	this->agregarHijo(nodParam);
	return nodParam;
	
}

void ViewXML::addStationCode(std::string code){
	
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "stations"){
			XMLNode *newNode = new XMLNode();
			newNode->setNombre("stationCode");
			newNode->setContenido(code);
			node->agregarHijo(newNode);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("stations");
	paramsNode->agregarHijo(nod);
	XMLNode *newNode = new XMLNode();
	newNode->setNombre("stationCode");
	newNode->setContenido(code);
	nod->agregarHijo(newNode);
	
}


void ViewXML::addStationRecord(std::string dateRecord, std::string hourRecord, std::string resultRecord ){
	
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "stations"){
			XMLNode *newNode = new XMLNode();
			newNode->setNombre("record");
			XMLNode *newAtribRecord = new XMLNode();
			newAtribRecord->setNombre("date");
			newAtribRecord->setContenido(dateRecord);
			newNode->agregarHijo(newAtribRecord);
			newAtribRecord = new XMLNode();
			newAtribRecord->setNombre("hour");
			newAtribRecord->setContenido(hourRecord);
			newNode->agregarHijo(newAtribRecord);
			newAtribRecord = new XMLNode();
			newAtribRecord->setNombre("result");
			newAtribRecord->setContenido(resultRecord);
			newNode->agregarHijo(newAtribRecord);
			node->agregarHijo(newNode);
		}	
	}
	return;
}


void ViewXML::addAtribsType(std::string atribType){
	
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
//	listaXML lsHijos = paramsNode->hijos;
//	listaXML::iterator it = lsHijos.begin();
//	//Especificaciones de Pablo, me habia equivocado y esta parte no va
/*	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "atrib"){
			XMLNode *newNode = new XMLNode();
			newNode->setNombre("atribType");
			newNode->setContenido(atribType);
			node->agregarHijo(newNode);
			return;
		}	
	}*/
	XMLNode* nod = new XMLNode();
	nod->setNombre("atrib");
	paramsNode->agregarHijo(nod);
	XMLNode *newNode = new XMLNode();
	newNode->setNombre("atribType");
	newNode->setContenido(atribType);
	nod->agregarHijo(newNode);
	
}

void ViewXML::addAtribsRecord(std::string dateRecord, std::string hourRecord, std::string resultRecord, std::string indType ){
	
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "atrib"){
			listaXML nodeHijos = node->hijos;
			listaXML::iterator it = nodeHijos.begin();
			for ( ; it != lsHijos.end(); it++){
				XMLNode* nodeAtrib = *it;
				if (nodeAtrib->getNombre() == "atribType" && nodeAtrib->getContenido() == indType){
					XMLNode *newNode = new XMLNode();
					newNode->setNombre("record");
					XMLNode *newAtribRecord = new XMLNode();
					newAtribRecord->setNombre("date");
					newAtribRecord->setContenido(dateRecord);
					newNode->agregarHijo(newAtribRecord);
					newAtribRecord = new XMLNode();
					newAtribRecord->setNombre("hour");
					newAtribRecord->setContenido(hourRecord);
					newNode->agregarHijo(newAtribRecord);
					newAtribRecord = new XMLNode();
					newAtribRecord->setNombre("result");
					newAtribRecord->setContenido(resultRecord);
					newNode->agregarHijo(newAtribRecord);
					node->agregarHijo(newNode);
				}
				else
					break;
			}
		}
	}
}

std::string ViewXML::toFile(int tab){
		
		XMLNode* node = (XMLNode*)this;
		string xml;
		xml = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
		xml += node->toString(tab);
		return (xml);

}

void ViewXML::addMsgToUsr(std::string contenido){

	msgToUsr += " "  + contenido;
	
	XMLNode *viewNode = (XMLNode*)this;
	// estamos en params
	listaXML lsHijos = viewNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "msgToUsr"){
			node->setContenido(msgToUsr);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("msgToUsr");
	nod->setContenido(msgToUsr);
	viewNode->agregarHijo(nod);

}



void ViewXML::addAlerta(std::string contenido){
	XMLNode *paramsNode = getParamsNode();
		// estamos en params
		listaXML lsHijos = paramsNode->hijos;
		listaXML::iterator it = lsHijos.begin();
		for ( ; it != lsHijos.end(); it++){
			XMLNode* node = *it;
			if (node->getNombre() == "alerta"){
				node->setContenido(contenido);
				return;
			}	
		}
		XMLNode* nod = new XMLNode();
		nod->setNombre("alerta");
		nod->setContenido(contenido);
		paramsNode->agregarHijo(nod);
}

void ViewXML::addSizeStationsAdded(int sizeStations){
	
	std::stringstream ss;
	ss.str("");
	ss << sizeStations;
	
	addNodeWithContent("cantStations", ss.str());
	
}
void ViewXML::addCantMuestrasSound(int tam){
	
	std::stringstream ss;
	ss.str("");
	ss << tam;
	
	addNodeWithContent("cantMuestrasSound", ss.str());
	
}
void ViewXML::addCantMuestrasSup(int tam){
	
	std::stringstream ss;
	ss.str("");
	ss << tam;
	
	addNodeWithContent("cantMuestrasSup", ss.str());
	
}
void ViewXML::addCantMuestrasClouds(int tam){
	
	std::stringstream ss;
	ss.str("");
	ss << tam;
	
	addNodeWithContent("cantMuestrasClouds", ss.str());
	
}

void ViewXML::addDate(std::string date)
{
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "date"){
			node->setContenido(date);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("date");
	nod->setContenido(date);
	paramsNode->agregarHijo(nod);

}
//
void ViewXML::addEstadisticsStation(std::string station)
{
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "stationCode"){
			node->setContenido(station);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("stationCode");
	nod->setContenido(station);
	paramsNode->agregarHijo(nod);

}


void ViewXML::addHour(std::string hour)
{
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "hour"){
			node->setContenido(hour);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("hour");
	nod->setContenido(hour);
	paramsNode->agregarHijo(nod);

}

void ViewXML::addResult(std::string result)
{
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "result"){
			node->setContenido(result);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("result");
	nod->setContenido(result);
	paramsNode->agregarHijo(nod);

}

void ViewXML::addTypeEst(std::string typeEst)
{
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "typeEst"){
			node->setContenido(typeEst);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("typeEst");
	nod->setContenido(typeEst);
	paramsNode->agregarHijo(nod);

}

void ViewXML::addAttrib(std::string atrib)
{
	XMLNode *paramsNode = getParamsNode();
	// estamos en params
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "atrib"){
			node->setContenido(atrib);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("atrib");
	nod->setContenido(atrib);
	paramsNode->agregarHijo(nod);

}

// Agrega un record en el node param
void ViewXML::addSampleSourcesafe(SampleSourcesafe  *ssf)
{
	XMLNode *paramsNode = getParamsNode();
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "SampleSourcesafe"){
			node->agregarHijo(ssf->toViewXML());
			return;
		}	
	}
//	XMLNode* nod = new XMLNode();
//	nod->setNombre("SampleSourcesafe");
//	this->agregarHijo(nod);
	paramsNode->agregarHijo(ssf->toViewXML());
}



void ViewXML::addCloudsLayer(CloudLayer *cl)
{
	XMLNode *paramsNode = getParamsNode();
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "CloudLayer"){
			node->agregarHijo(cl->toViewXML());
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("CloudLayer");
	paramsNode->agregarHijo(nod);
	nod->agregarHijo(cl->toViewXML());
}
void ViewXML::addSampleSounding(SampleSounding  * ssd, Station * st)
{
	XMLNode *paramsNode = getParamsNode();
	/*listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "SampleSounding"){
			node->agregarHijo(ssd->toViewXML(st->getLatitude(),st->getLongitude(), st->getElevation()));
			return;
		}	
	}*/
//	XMLNode* nod = new XMLNode();
//	nod->setNombre("SampleSounding");
//	paramsNode->agregarHijo(nod);
	paramsNode->agregarHijo(ssd->toViewXML(st->getLatitude(),st->getLongitude(), st->getElevation()));
}
void ViewXML::addConditionAtm(ConditionAtm  * ca)
{
	XMLNode *paramsNode = getParamsNode();
	listaXML lsHijos = paramsNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "ConditionAtm"){
			node->agregarHijo(ca->toViewXML());
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("ConditionAtm");
	paramsNode->agregarHijo(nod);
	nod->agregarHijo(ca->toViewXML());
}

void ViewXML::addMethod(std::string mtdo)
{
	
	XMLNode *viewNode = (XMLNode*)this;
	// estamos en params
	listaXML lsHijos = viewNode->hijos;
	listaXML::iterator it = lsHijos.begin();
	for ( ; it != lsHijos.end(); it++){
		XMLNode* node = *it;
		if (node->getNombre() == "method"){
			node->setContenido(mtdo);
			return;
		}	
	}
	XMLNode* nod = new XMLNode();
	nod->setNombre("method");
	nod->setContenido(mtdo);
	this->agregarHijo(nod);
	
}
std::string ViewXML::getMsgToUsr()
{
	return this->msgToUsr;
}

